package com.nova;

import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.nova.source.R;
import com.nova.view.NovaTextDialog;

import android.app.Activity;
import android.app.ProgressDialog;
import android.app.Service;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.graphics.Color;
import android.media.MediaPlayer;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Vibrator;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.CharacterStyle;
import android.text.style.ForegroundColorSpan;
import android.util.DisplayMetrics;
import android.view.KeyEvent;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.widget.Toast;

/**
 * 公共变量
 */
public class NovaGlobalConts {
	private static NovaTextDialog textDialog;

	/** 网络是否存在 */
	public static boolean isNetworkAvailable(Context cnt) {
		Context context = cnt.getApplicationContext();
		ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
		if (connectivity == null) {

			return false;
		} else {
			// if (isWifiConnected(cnt)) {
			// return Network(cnt);
			// }
			NetworkInfo[] info = connectivity.getAllNetworkInfo();
			if (info != null) {
				for (int i = 0; i < info.length; i++) {
					if (info[i].getState() == NetworkInfo.State.CONNECTED) {
						return true;
					}
				}
			}
		}
		return false;
	}

	/**
	 * 获取身体质量指数
	 * 
	 * @param height
	 *            身高(米)
	 * @param weight
	 *            体重(公斤)
	 * @return BMI
	 * @author 鹿云龙
	 * @date 2016年1月14日 上午9:13:31
	 */
	public static double getBMI(double height, double weight) {
		// java运算,体重指数(BMI)=体重(kg)/身高(m)2 怎
		double bmi = (weight / (height * height));

		return bmi;
	}

	/**
	 * 获取网络状态
	 * 
	 * @return boolean 网络状态 true为网络状态良好，false为网络状态不好
	 */
	public static boolean Network(Context cnt) {
		WifiManager wifi_service = (WifiManager) cnt.getSystemService(cnt.WIFI_SERVICE);
		WifiInfo wifiInfo = wifi_service.getConnectionInfo();
		// wifiInfo.getBSSID();
		// wifiInfo.getSSID();
		// wifiInfo.getIpAddress();// 获取IP地址。
		// wifiInfo.getMacAddress();// 获取MAC地址。
		// wifiInfo.getNetworkId();// 获取网络ID。
		// wifiInfo.getLinkSpeed();// 获取连接速度，可以让用户获知这一信息。
		int rssi = wifiInfo.getRssi();// 获取信号强度
		if (rssi < -80) {
			return false;
		} else {
			return true;
		}
	}

	/**
	 * 是否链接wifi
	 * 
	 * @param context
	 * @return
	 */
	public static boolean isWifiConnected(Context context) {
		ConnectivityManager connectivityManager = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo wifiNetworkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
		if (wifiNetworkInfo.isConnected()) {
			return true;
		}
		return false;
	}

	/**
	 * 是否是正确的手机号或者座机
	 * 
	 * @param phoneNumber
	 * @return
	 */

	public static boolean isPhoneNumberValid(String phoneNumber) {
		boolean isValid = false;
		String expression = "((^(\\d{2,4}[-_－—]?)?\\d{3,8}([-_－—]+\\d{3,8})?([-_－—]+\\d{1,7})?$)|(^0?1[35]\\d{9}$))";
		CharSequence inputStr = phoneNumber;
		Pattern pattern = Pattern.compile(expression);
		Matcher matcher = pattern.matcher(inputStr);
		if (matcher.matches()) {
			isValid = true;
		}
		return isValid;
	}

	public static boolean isTelValid(String phoneNumber) {
		boolean isValid = false;
		// String
		// expression="((^(\\d{2,4}[-_－—]?)?\\d{3,8}([-_－—]+\\d{3,8})?([-_－—]+\\d{1,7})?$)|(^0?1[35]\\d{9}$))";
		String expression = "((^((0\\d{2,3})-)(\\d{7,8})(-(\\d{3,}))?$))";
		CharSequence inputStr = phoneNumber;
		Pattern pattern = Pattern.compile(expression);
		Matcher matcher = pattern.matcher(inputStr);
		if (matcher.matches()) {
			isValid = true;
		}
		return isValid;
	}

	/** 替换 html中换行符、空格 */
	public String repText(String str) throws Exception {
		String r = null;
		r = str.replaceAll("<br/>", "\n");
		r = r.replaceAll("&nbsp;", " ");

		return r;
	}

	/** 正则表达式验证特殊字符及符号 进行编号的认证 */
	public boolean isSpecialSymbols(String str_content) {

		String regTitle = "[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？]";
		Pattern p = Pattern.compile(regTitle);
		Matcher m = p.matcher(str_content);
		if (m.find()) {
			return false;
		} else {
			return true;
		}
	}

	/** 去除字符串中的空格\\s*,回车\n,换行符\r,制表符\t */
	public void isReplaceStr(String str_content) {
		Pattern p = Pattern.compile("\\s*|\t|\r|\n");
		p.matcher(str_content);

	}

	/***
	 * 比较两个日期的大小
	 * 
	 * @param sdate
	 * @param edate
	 * @return if(sdate<edate){return true;}elase{return false;}
	 * @author 鹿云龙
	 * @date 2016年1月21日 上午9:07:26
	 */
	public static boolean compareDate(Date sdate, Date edate) {
		try {
			if (sdate.getTime() < edate.getTime()) {
				return true;
			} else {
				return false;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return true;
		}
	}

	/**
	 * 计算日期，加或减去指定的时间量
	 * 
	 * @param date
	 *            要计算的日期
	 * @param i
	 *            加或减去指定的天数
	 * @return
	 * @author 鹿云龙
	 * @date 2016年1月21日 下午2:15:57
	 */
	public static Date getDate(Date date, int i) {
		Calendar calendar = Calendar.getInstance(); // 得到日历
		calendar.setTime(date);// 把当前时间赋给日历
		calendar.add(Calendar.DAY_OF_MONTH, i);
		date = calendar.getTime();
		return date;
	}

	/**
	 * 比较时间大小
	 * 
	 * @param stime
	 * @param etime
	 * @return
	 */
	public static boolean comparedate(String stime, String etime) {
		// Log.w("bi333333333---------", "" + stime + "\n" + etime);
		java.text.DateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd");
		java.util.Calendar c1 = java.util.Calendar.getInstance();
		java.util.Calendar c2 = java.util.Calendar.getInstance();

		try {
			c1.setTime(df.parse(stime));
			c2.setTime(df.parse(etime));

		} catch (java.text.ParseException e) {
			System.err.println("格式不正确");
			return false;
		}
		int result = c1.compareTo(c2);
		// Log.w("bijiaojieguo-----------", "" + result);
		if (result <= 0) {
			return false;
		} else {
			return true;
		}

	}

	/**
	 * 判断相差时间
	 * 
	 * @param stime
	 * @param etime
	 * @return
	 * @author 王婷婷
	 * @date 2015年12月12日 上午11:02:16
	 */
	public static int getAge(Date bornTime) {
		int age = -1;
		try {
			// bornDate = (Date) dateFormat.parse(bornTime);
			java.util.Calendar born = java.util.Calendar.getInstance();
			java.util.Calendar now = java.util.Calendar.getInstance();
			if (bornTime != null) {
				// born.setTime(bornDate);
				born.setTime(bornTime);
				now.setTime(new Date());
				age = now.get(Calendar.YEAR) - born.get(Calendar.YEAR);
				if (now.get(Calendar.DAY_OF_YEAR) < born.get(Calendar.DAY_OF_YEAR)) {
					age -= 1;
				}
			}

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return age;

	}

	// 判断sd卡的照片文件是不是存在
	public static boolean fileIsExists(String filepath) {
		File f = new File(filepath);
		if (!f.exists()) {
			return false;
		}
		return true;
	}

	public static ProgressDialog showProgress(Context ctx, String msg) {
		// , "请稍等...", "数据正在获取中..."
		ProgressDialog dialog = ProgressDialog.show(ctx, "请稍等", msg, true);
		return dialog;
	}

	public static void showToast(Context context, String message) {
		Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
	}

	/**
	 * 获取10位时间戳
	 * 
	 * @return
	 */
	public static String getTimestamp() {
		long l = new Date().getTime();
		return (String.valueOf(l)).substring(0, 10);
	}

	/**
	 * @param res
	 *            原字符串
	 * @param str
	 *            要插入的字符串
	 * @param index
	 *            插入位置
	 * @return
	 */
	public static String stringinsert1(String res, String str, int index) {
		return res.substring(0, index) + str + res.substring(index + 1, res.length());
	}

	public static int getRandomInt() {
		return 0;
	}

	/**
	 * 生成min->max之间的数,最小生成的随机数为min，最大生成的随机数为max
	 * 
	 * @param min
	 *            最小随机数
	 * @param max
	 *            最大随机数
	 */
	public static int getRandomNum(int min, int max) {

		int i = 0;
		while (true) {
			Random rdm = new Random();

			i = rdm.nextInt(max - min + 1) + min;
			if (i <= max && i >= min) {
				i = rdm.nextInt(max - min + 1) + min;
				return i;
			}
		}
	}

	private static float cm = 0;

	public static void setPixal(DisplayMetrics dm) {
		cm = (float) (dm.xdpi / 2.54); // 单位都是pixal
	}

	public static float getPixal() {
		return cm;
	}

	/**
	 * 随机获取true或false
	 * 
	 * @return
	 */
	public static boolean getRandom() {
		int i = (int) (Math.random() * 10);
		// System.out.println(i);
		if (i == 0) {
			return true;
		} else if (i % 2 == 0) {
			return true;
		}
		return false;
	}

	/**
	 * 带有\n换行符的字符串都可以用此方法显示2种颜色
	 * 
	 * @param text
	 * @param color1
	 * @param color2
	 * @return
	 */
	public static SpannableStringBuilder highlight(String text, int color1, int color2, int fontSize) {
		SpannableStringBuilder spannable = new SpannableStringBuilder(text);// 用于可变字符串
		CharacterStyle span_0 = null, span_1 = null, span_2;
		int end = text.indexOf("\n");
		if (end == -1) {// 如果没有换行符就使用第一种颜色显示
			span_0 = new ForegroundColorSpan(color1);
			spannable.setSpan(span_0, 0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
		} else {
			span_0 = new ForegroundColorSpan(color1);
			span_1 = new ForegroundColorSpan(color2);
			spannable.setSpan(span_0, 0, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
			spannable.setSpan(span_1, end + 1, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

			span_2 = new AbsoluteSizeSpan(fontSize);// 字体大小
			spannable.setSpan(span_2, end + 1, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
		}
		return spannable;
	}

	/**
	 * 播放系统提示音
	 * 
	 * @param context
	 * @throws IllegalArgumentException
	 * @throws SecurityException
	 * @throws IllegalStateException
	 * @throws IOException
	 * @author 鹿云龙
	 * @date 2015年8月8日 上午11:21:18
	 */
	public static void soundRing(Context context, AssetManager assetManager)
			throws IllegalArgumentException, SecurityException, IllegalStateException, IOException {
		MediaPlayer mp = new MediaPlayer();
		mp.reset();
		AssetFileDescriptor afd = assetManager.openFd("2.mp3");
		mp.setDataSource(afd.getFileDescriptor());
		mp.prepare();
		mp.start();

		Vibrator vv = (Vibrator) context.getSystemService(Service.VIBRATOR_SERVICE);
		vv.vibrate(1000);// 震1秒钟
	}

	/**
	 * @功能描述: 去除空格
	 */
	public static String trimWhitespace(String str) {
		CharSequence cstr = (CharSequence) str;
		boolean hasLength = (cstr != null && cstr.length() > 0);
		if (!hasLength) {
			return str;
		}
		StringBuilder sb = new StringBuilder(str);
		while (sb.length() > 0 && Character.isWhitespace(sb.charAt(0))) {
			sb.deleteCharAt(0);
		}
		while (sb.length() > 0 && Character.isWhitespace(sb.charAt(sb.length() - 1))) {
			sb.deleteCharAt(sb.length() - 1);
		}
		return sb.toString();
	}

	/**
	 * 是否支持蓝牙4.0
	 */
	public static boolean isBLE(Activity activity) {
		// 检测设备是否支持ble
		if (!activity.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
			NovaGlobalConts.showToast(activity, "该设备不支持ble");
			return false;
		}
		return true;
	}

	public void setmaxlength(EditText edittext, final double max, double min) {
		edittext.setOnEditorActionListener(new OnEditorActionListener() {

			@Override
			public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
				// TODO Auto-generated method stub
				String strdlsj = v.getText().toString();
				if (Double.parseDouble(v.getText().toString()) < max) {

				} else {
					// v.setText(strdlsj);
				}

				return false;
			}
		});
	}

	/**
	 * 计算 血清低密度脂蛋白胆固醇
	 * 
	 * @param tc
	 *            总胆固醇
	 * @param tg
	 *            甘油三酯
	 * @param hdl
	 *            血清高密度脂蛋白胆固醇
	 * @return
	 * @author 鹿云龙
	 * @date 2016年1月14日 下午4:52:15
	 */
	public static double calcLdl(double tc, double tg, double hdl) {
		double ldl = tc - hdl - (tg / 2.2);
		return ldl;
	}

	public static void showTextDialog(Context ctx, String text) {
		if (textDialog == null)
			textDialog = new NovaTextDialog(ctx);
		textDialog.setText(text);
		textDialog.show();
	}

	/**
	 * 验证EditText 最多允许输入两位小数
	 * 
	 * @author 王婷婷
	 * @date 2016年2月3日 上午11:10:15
	 */
	public static void keep2decimal(final EditText ed_text) {
		ed_text.addTextChangedListener(new TextWatcher() {

			@Override
			public void onTextChanged(CharSequence s, int start, int before, int count) {
				String text = s.toString();
				if (text.contains(".")) {
					int index = text.indexOf(".");
					if (index + 3 < text.length()) {
						text = text.substring(0, index + 3);
						ed_text.setText(text);
						ed_text.setSelection(text.length());
					}
				}
			}

			@Override
			public void beforeTextChanged(CharSequence s, int start, int count, int after) {
				// TODO Auto-generated method stub
				ed_text.getDrawingCacheBackgroundColor();
			}

			@Override
			public void afterTextChanged(Editable s) {
				// TODO Auto-generated method stub

			}
		});
	}
	
	/**
	 * 判断是否可以将字符串转换成浮点型数据
	 * @param str  
	 * @return
	 * @author 王婷婷
	 * @date 2017年8月9日 下午3:55:47
	 * 
	 * 备注：[0-9]*(\\.?)[0-9]* 是浮点型  ；  [0-9]* 整形
	 */
	public static boolean isFloatNumberMatcher(String str) {
		Pattern pattern = Pattern.compile("^(-?\\d+)(\\.\\d+)?$");
		Matcher isNum = pattern.matcher(str);
		if (!isNum.matches()) {
			return false;
		}
		return true;
	}
}